package com.boot2523.myrabbitmq.q5;

import com.rabbitmq.client.*;

public class Weather {
    private static final String EXCHANGE_NAME = "topic_logs";
    private static final String BINDING_KEY = "#.天气";

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");

        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
//        声明一个名为 EXCHANGE_NAME 的 topic 类型的交换机。
//        这是 RabbitMQ 中实现灵活路由消息的核心机制，适用于需要根据多个维度动态订阅消息的场景。
//        topic 是 RabbitMQ 四种主要交换机类型之一（还有 direct, fanout, headers），它的行为如下：
//• 基于 routing key 的模糊匹配：
//• routing key 是一个用点号（.）分隔的字符串，例如："user.login.success"、"order.payment.failed"。
//• 队列在绑定到 topic 交换机时可以使用通配符来匹配 routing key：
//• *（星号）：匹配一个单词；
//• #（井号）：匹配零个或多个单词。
//• 非常灵活的消息路由机制，适合构建多维度的消息订阅系统。
        channel.exchangeDeclare(EXCHANGE_NAME, "topic");

        String queueName = channel.queueDeclare().getQueue();

        channel.queueBind(queueName, EXCHANGE_NAME, BINDING_KEY);

        System.out.println(" [*] Weather waiting for messages with binding key: " + BINDING_KEY);

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            String routingKey = delivery.getEnvelope().getRoutingKey();
            System.out.println(" [Weather] Received (" + routingKey + "): " + message);
        };

        channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {});
    }
}